home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2004 #11 / Amiga Plus CD - 2004 - No. 11.iso / AmiSoft / Dev / misc / temgen.lha / Temgen / tg-0.11 / tg.y < prev    next >
Text File  |  2002-12-18  |  31KB  |  701 lines

  1. %token   <i>   TOK_NUM         
  2. %token   <f>   TOK_FLOAT             
  3. %token   <s>   TOK_NAME                  
  4. %token   <s>   TOK_STRING              
  5. %token   <i>   TOK_CHAR                       
  6. %token   <s>   TOK_DOL
  7. %token   <s>   TOK_DIV
  8. %token   <s>   TOK_DOT
  9. %token   <s>   TOK_COM
  10. %token   <s>   TOK_STAR
  11. %token   <s>   TOK_PLUS
  12. %token   <s>   TOK_MINUS
  13. %token   <i>   TOK_PLUSPLUS
  14. %token   <i>   TOK_MINUSMINUS
  15. %token   <i>   TOK_PLUS_S
  16. %token   <i>   TOK_MINUS_S
  17. %token   <i>   TOK_DIV_S
  18. %token   <i>   TOK_MUL_S 
  19. %token   <s>   TOK_CLOSE
  20. %token   <s>   TOK_CLOSEB
  21. %token   <s>   TOK_NL
  22. %token   <s>   TOK_OPEN
  23. %token   <s>   TOK_OPENB
  24. %token   <i>   TOK_COLON
  25. %token   <i>   TOK_SCOL 
  26. %token   <i>   TOK_AT   
  27. %token   <i>   TOK_EQ   
  28. %token   <i>   TOK_IN   
  29. %token   <i>   TOK_EQEQ   
  30. %token   <i>   TOK_LT     
  31. %token   <i>   TOK_NE     
  32. %token   <i>   TOK_GT     
  33. %token   <i>   TOK_NOT    
  34. %token   <i>   TOK_AND    
  35. %token   <i>   TOK_OR     
  36. %token   <i>   TOK_LTEQ   
  37. %token   <i>   TOK_GTEQ   
  38.  
  39. %token   <i>   TOK_IF
  40. %token   <i>   TOK_ELSE
  41. %token   <i>   TOK_ENDIF
  42. %token   <i>   TOK_EMBED
  43. %token   <i>   TOK_EMIT 
  44. %token   <i>   TOK_OUTPUT
  45. %token   <i>   TOK_LOCAL 
  46. %token   <i>   TOK_PUSH 
  47. %token   <i>   TOK_POP  
  48. %token   <i>   TOK_FUNCTION
  49. %token   <i>   TOK_ENDFUNCTION
  50. %token   <i>   TOK_SWITCH
  51. %token   <i>   TOK_CASE
  52. %token   <i>   TOK_FOR
  53. %token   <i>   TOK_ENDSWITCH
  54. %token   <i>   TOK_ENDFOR
  55. %token   <i>   TOK_RETURN
  56. %token   <i>   TOK_BREAK 
  57. %token   <i>   TOK_USE   
  58. %token   <i>   TOK_EXIT  
  59.  
  60. %type    <p>   obj
  61. %type    <p>   ear
  62. %type    <p>   exp
  63. %type    <p>   array
  64. %type    <p>   record
  65. %type    <p>   constructor
  66. %type    <p>   emul
  67. %type    <l>   data_line
  68. %type    <l>   ctl_cmd  
  69. %type    <l>   cmd_if   
  70. %type    <l>   cmd_function
  71. %type    <l>   cmd_switch
  72. %type    <l>   cmd_for
  73. %type    <l>   cmd_exp
  74. %type    <l>   cmd_embed
  75. %type    <l>   cmd_emit
  76. %type    <l>   cmd_output
  77. %type    <l>   cmd_local 
  78. %type    <l>   cmd_return
  79. %type    <l>   cmd_break 
  80. %type    <l>   cmd_push  
  81. %type    <l>   cmd_pop   
  82. %type    <l>   cmd_use   
  83. %type    <l>   cmd_exit   
  84. %type    <p>   fun_body  
  85. %type    <p>   objpart
  86. %type    <p>   forctl 
  87. %type    <p>   optexp 
  88. %type    <p>   case_list
  89. %type    <p>   case_item
  90. %type    <p>   param_list
  91. %type    <p>   param_list1
  92. %type    <s>   other_token
  93. %type    <p>   dol_exp     
  94. %type    <p>   smp_exp     
  95. %type    <p>   arglist     
  96. %type    <p>   arglist1 
  97. %type    <i>   relop
  98.  
  99. %union  {
  100.     struct int_rec {
  101.             int            val;
  102.             int            line;
  103.             int            start, end;
  104.     } i;
  105.  
  106.     struct float_rec {
  107.             float          val;
  108.             int            line;
  109.             int            start, end;
  110.     } f;
  111.     
  112.     struct char_rec {
  113.             char          *val;
  114.             int            line;
  115.             int            start, end;
  116.     } s;
  117.     
  118.     struct ptr_rec {
  119.             void          *val;
  120.             int            line;
  121.             int            start, end;
  122.     } p;
  123.     
  124.     struct line_rec {
  125.         int    line;
  126.         struct command *cmd;
  127.     } l;
  128. }
  129.  
  130. %{
  131. #include "alloc.h"
  132. #include "generator.h"    
  133. #include "util.h"    
  134.     
  135. #include <stdio.h>
  136. #define FL     fflush(stdout);    
  137. #define dpr    printf 
  138. #define P(s)   {dpr(s);}
  139.  
  140. #undef  YYDEBUG        
  141. #define YYDEBUG 1
  142.  
  143. #undef  YYERROR_VERBOSE        
  144. #define YYERROR_VERBOSE   1
  145.     
  146. int   yydebug = 0;        
  147. char *errmsg = "syntax error";
  148.  
  149. extern struct txttab *text_table;
  150. extern struct lintab *line_table;
  151. extern int curfilen;
  152. extern int lineno;
  153.  
  154. #define  ERR(msg) save_error(atom_name(curfilen), lineno, msg)
  155. %}
  156.  
  157. %%
  158. lines: 
  159.   |    cmd                        
  160.   |    lines eol                  
  161.   |    lines eol cmd          
  162.   ;
  163.   
  164. eol:   TOK_NL                     { close_line( $1.line, $1.end ); }
  165.   ;
  166.   
  167. cmd:   data_line                  {          
  168.                                     lt_set( line_table, $1.line, $1.cmd );
  169.                                   }
  170.   |    ctl_cmd                    { 
  171.                                     add_cmd( line_table, $1.line, $1.cmd );
  172.                                   }
  173.   ;
  174.                                   
  175.  
  176. data_line:  other_token           { 
  177.                                     $$.line = $1.line; 
  178.                                     $$.cmd = build_lcmd_c(0, $1.start, $1.end);
  179.                                   } 
  180.   |    dol_exp                    { 
  181.                                     /* dump_expression( $1.val ); */
  182.                                     $$.line = $1.line; 
  183.                                     $$.cmd = build_lcmd_e(0, $1.val, $1.start, 
  184.                                             $1.end);
  185.                                   }
  186.   |    data_line other_token      { 
  187.                                     $$.line = $1.line;
  188.                                     $$.cmd = build_lcmd_c($1.cmd, 
  189.                                             $2.start, $2.end);
  190.                                   }     
  191.   |    data_line dol_exp          { 
  192.                                     /* dump_expression( $2.val ); */
  193.                                     $$.line = $1.line; 
  194.                                     $$.cmd = build_lcmd_e($1.cmd, $2.val, $2.start, $2.end);
  195.                                   }
  196.   ;
  197.   
  198. other_token:    TOK_NUM     { $$.line=$1.line;$$.start=$1.start;$$.end=$1.end; }
  199.   |             TOK_FLOAT   { $$.line=$1.line;$$.start=$1.start;$$.end=$1.end; }
  200.   |             TOK_NAME    { $$.line=$1.line;$$.start=$1.start;$$.end=$1.end; }
  201.   |             TOK_STRING  { $$.line=$1.line;$$.start=$1.start;$$.end=$1.end; }
  202.   |             TOK_CHAR    { $$.line=$1.line;$$.start=$1.start;$$.end=$1.end; }
  203.   |             TOK_DOT     { $$.line=$1.line;$$.start=$1.start;$$.end=$1.end; }
  204.   |             TOK_COLON   { $$.line=$1.line;$$.start=$1.start;$$.end=$1.end; }
  205.   |             TOK_SCOL    { $$.line=$1.line;$$.start=$1.start;$$.end=$1.end; }
  206.   |             TOK_COM     { $$.line=$1.line;$$.start=$1.start;$$.end=$1.end; }
  207.   |             TOK_EQ      { $$.line=$1.line;$$.start=$1.start;$$.end=$1.end; }
  208.   |             TOK_LT      { $$.line=$1.line;$$.start=$1.start;$$.end=$1.end; }
  209.   |             TOK_IN      { $$.line=$1.line;$$.start=$1.start;$$.end=$1.end; }
  210.   |             TOK_NE      { $$.line=$1.line;$$.start=$1.start;$$.end=$1.end; }
  211.   |             TOK_GT      { $$.line=$1.line;$$.start=$1.start;$$.end=$1.end; }
  212.   |             TOK_NOT     { $$.line=$1.line;$$.start=$1.start;$$.end=$1.end; }
  213.   |             TOK_AND     { $$.line=$1.line;$$.start=$1.start;$$.end=$1.end; }
  214.   |             TOK_OR      { $$.line=$1.line;$$.start=$1.start;$$.end=$1.end; }
  215.   |             TOK_EQEQ    { $$.line=$1.line;$$.start=$1.start;$$.end=$1.end; }
  216.   |             TOK_LTEQ    { $$.line=$1.line;$$.start=$1.start;$$.end=$1.end; }
  217.   |             TOK_GTEQ    { $$.line=$1.line;$$.start=$1.start;$$.end=$1.end; }
  218.   |             TOK_STAR    { $$.line=$1.line;$$.start=$1.start;$$.end=$1.end; }
  219.   |             TOK_PLUS    { $$.line=$1.line;$$.start=$1.start;$$.end=$1.end; }
  220.   |             TOK_MINUS_S { $$.line=$1.line;$$.start=$1.start;$$.end=$1.end; }
  221.   |             TOK_PLUS_S  { $$.line=$1.line;$$.start=$1.start;$$.end=$1.end; }
  222.   |             TOK_MUL_S   { $$.line=$1.line;$$.start=$1.start;$$.end=$1.end; }
  223.   |             TOK_DIV_S   { $$.line=$1.line;$$.start=$1.start;$$.end=$1.end; }
  224.   |             TOK_MINUS   { $$.line=$1.line;$$.start=$1.start;$$.end=$1.end; }
  225.   |             TOK_PLUSPLUS   {
  226.                             $$.line=$1.line;$$.start=$1.start;$$.end=$1.end; }
  227.   |             TOK_MINUSMINUS { 
  228.                             $$.line=$1.line;$$.start=$1.start;$$.end=$1.end; }
  229.   |             TOK_DIV     { $$.line=$1.line;$$.start=$1.start;$$.end=$1.end; }
  230.   |             TOK_OPEN    { $$.line=$1.line;$$.start=$1.start;$$.end=$1.end; }
  231.   |             TOK_CLOSE   { $$.line=$1.line;$$.start=$1.start;$$.end=$1.end; }
  232.   |             TOK_OPENB   { $$.line=$1.line;$$.start=$1.start;$$.end=$1.end; }
  233.   |             TOK_CLOSEB  { $$.line=$1.line;$$.start=$1.start;$$.end=$1.end; }    
  234.   ;
  235.   
  236. dol_exp:        TOK_DOL obj            { 
  237.                                           $$.line = $1.line;
  238.                                           $$.start = $1.start;
  239.                                           $$.end = $2.end;
  240.                                           $$.val = new_objexp( $2.val );
  241.                                        }
  242.   |             TOK_DOL TOK_OPEN exp TOK_CLOSE  {
  243.                                           $$.line = $1.line;
  244.                                           $$.start = $1.start;
  245.                                           $$.end = $4.end;
  246.                                           $$.val = $3.val;
  247.                                        }
  248.   |             TOK_DOL error          { ERR(        
  249.                                        "'(', '$' or object expected after '$'");
  250.                                           $$.val = 0; 
  251.                                        }                                       
  252.   ;
  253.   
  254. obj:            objpart                {
  255.                                           $$.line = $1.line;
  256.                                           $$.start = $1.start;
  257.                                           $$.end = $1.end;
  258.                                           $$.val = new_object( 0, $1.val );
  259.                                        }
  260.   |             obj TOK_DOT objpart    { 
  261.                                           $$.line = $1.line; 
  262.                                           $$.start = $1.start;
  263.                                           $$.end = $3.end; 
  264.                                           $$.val = new_object($1.val, $3.val);
  265.                                        }
  266.   |             obj TOK_DOT error      { 
  267.                                          ERR("object expected after '.'"); 
  268.                                          $$.val = 0;
  269.                                        }                                     
  270.   ;
  271.   
  272. relop:          TOK_EQEQ               {  $$.val = 'e'; }
  273.   |             TOK_EQ                 {  $$.val = '='; }
  274.   |             TOK_LT                 {  $$.val = '<'; }
  275.   |             TOK_GT                 {  $$.val = '>'; }
  276.   |             TOK_NE                 {  $$.val = '!'; }
  277.   |             TOK_LTEQ               {  $$.val = 'l'; }
  278.   |             TOK_GTEQ               {  $$.val = 'g'; }
  279.   |             TOK_MUL_S              {  $$.val = '1'; }
  280.   |             TOK_DIV_S              {  $$.val = '2'; }
  281.   |             TOK_PLUS_S             {  $$.val = '3'; }
  282.   |             TOK_MINUS_S            {  $$.val = '4'; }
  283.   |             TOK_OR                 {  $$.val = '|'; }
  284.   |             TOK_AND                {  $$.val = '&'; }
  285.   ;
  286.  
  287. exp:            ear
  288.   |             exp relop ear          {
  289.                                           $$.line = $1.line;
  290.                                           $$.start = $1.start;
  291.                                           $$.end = $3.end;
  292.                                           $$.val = new_exp($1.val, $2.val, $3.val);
  293.                                        }  
  294.   ;
  295.                                        
  296. ear:            emul                   
  297.   |             ear TOK_PLUS   emul    {
  298.                                           $$.line = $1.line; 
  299.                                           $$.start = $1.start;
  300.                                           $$.end = $3.end; 
  301.                                           $$.val = new_exp($1.val, '+', $3.val);
  302.                                        }
  303.   |             ear TOK_MINUS  emul    {
  304.                                           $$.line = $1.line; 
  305.                                           $$.start = $1.start;
  306.                                           $$.end = $3.end; 
  307.                                           $$.val = new_exp($1.val, '-', $3.val);
  308.                                        }
  309.   |             ear TOK_PLUS error     {  
  310.                                           ERR("expression expected after '+'"); 
  311.                                           $$.val = 0;
  312.                                        }                                      
  313.   |             ear TOK_MINUS error    {  
  314.                                           ERR("expression expected after '-'"); 
  315.                                           $$.val = 0;
  316.                                        }                                      
  317.   ;
  318.   
  319. emul:           smp_exp                
  320.   |             emul TOK_STAR  smp_exp {
  321.                                           $$.line = $1.line; 
  322.                                           $$.start = $1.start;
  323.                                           $$.end = $3.end; 
  324.                                           $$.val = new_exp($1.val, '*', $3.val);
  325.                                        }
  326.   |             emul TOK_DIV   smp_exp {
  327.                                           $$.line = $1.line; 
  328.                                           $$.start = $1.start;
  329.                                           $$.end = $3.end; 
  330.                                           $$.val = new_exp($1.val, '/', $3.val);
  331.                                        }
  332.   |             emul TOK_STAR error    {  ERR("expression expected after '*'");
  333.                                           $$.val = 0;
  334.                                        }                                      
  335.   |             emul TOK_DIV error     {  ERR("expression expected after '/'");
  336.                                           $$.val = 0;
  337.                                        }                                      
  338.   ;
  339.   
  340. array:          exp                    {  $$.line = $1.line;
  341.                                           $$.start = $1.start;
  342.                                           $$.end = $1.end;
  343.                                           $$.val = new_explist( 0, $1.val );
  344.                                        }   
  345.   |             array TOK_COM exp      {  $$.line = $1.line;
  346.                                           $$.start = $1.start;
  347.                                           $$.end = $1.end;
  348.                                           $$.val = new_explist($1.val, $3.val);
  349.                                        }   
  350.   ;
  351.   
  352. record:         TOK_NAME TOK_COLON exp {  $$.line = $1.line;
  353.                                           $$.start = $1.start;
  354.                                           $$.end = $3.end;
  355.                                           $$.val = new_fldlist( 0, $1.val,
  356.                                                   $3.val );
  357.                                        }
  358.   |             record TOK_COM TOK_NAME TOK_COLON exp {
  359.                                           $$.line = $1.line; 
  360.                                           $$.start = $1.start;
  361.                                           $$.end = $5.end;
  362.                                           $$.val = new_fldlist( $1.val, $3.val,
  363.                                                       $5.val );
  364.                                        }
  365.   ;
  366.   
  367. constructor:    TOK_OPENB array TOK_CLOSEB {
  368.                                           $$.line = $1.line;
  369.                                           $$.start = $1.start;
  370.                                           $$.end = $3.end;
  371.                                           $$.val = new_array( $2.val );
  372.                                        }
  373.   |             TOK_OPENB record TOK_CLOSEB {
  374.                                           $$.line = $1.line;
  375.                                           $$.start = $1.start;
  376.                                           $$.end = $3.end;
  377.                                           $$.val = new_record( $2.val );
  378.                                        }
  379.   |             TOK_OPENB error        {  ERR("error in array definition");
  380.                                           $$.val = 0;
  381.                                           $$.line = $1.line;
  382.                                        }      
  383.   ;
  384.   
  385. smp_exp:        dol_exp
  386.   |             constructor                                     
  387.   |             smp_exp TOK_PLUSPLUS   { 
  388.                                           $$.line = $1.line;
  389.                                           $$.start = $1.start;
  390.                                           $$.end = $2.end;
  391.                                           $$.val = new_inc( $1.val, +1, 1 );
  392.                                        }
  393.   |             TOK_PLUSPLUS smp_exp   {
  394.                                           $$.line = $1.line;
  395.                                           $$.start = $1.start;
  396.                                           $$.end = $2.end;
  397.                                           $$.val = new_inc( $2.val, +1, 0 );
  398.                                        }
  399.   |             TOK_NOT smp_exp        {
  400.                                           $$.line = $1.line;
  401.                                           $$.start = $1.start;
  402.                                           $$.end = $2.end;
  403.                                           $$.val = new_exp( 0, 'n', $2.val);
  404.                                        }  
  405.   |             TOK_MINUS smp_exp      {
  406.                                           $$.line = $1.line;
  407.                                           $$.start = $1.start;
  408.                                           $$.end = $2.end;
  409.                                           $$.val = new_exp( 0, '-', $2.val);
  410.                                        }  
  411.   |             smp_exp TOK_MINUSMINUS { 
  412.                                           $$.line = $1.line;
  413.                                           $$.start = $1.start;
  414.                                           $$.end = $2.end;
  415.                                           $$.val = new_inc( $1.val, -1, 1 );
  416.                                        }
  417.   |             TOK_MINUSMINUS smp_exp {
  418.                                           $$.line = $1.line;
  419.                                           $$.start = $1.start;
  420.                                           $$.end = $2.end;
  421.                                           $$.val = new_inc( $2.val, -1, 0 );
  422.                                        }
  423.   |             TOK_NUM                {   
  424.                                           $$.line = $1.line; 
  425.                                           $$.start = $1.start;
  426.                                           $$.end = $1.end; 
  427.                                           $$.val = new_num($1.val);
  428.                                        }
  429.   |             TOK_FLOAT              {
  430.                                           $$.line = $1.line; 
  431.                                           $$.start = $1.start;
  432.                                           $$.end = $1.end; 
  433.                                           $$.val = new_float($1.val);
  434.                                        }
  435.   |             TOK_STRING             {
  436.                                           $$.line = $1.line; 
  437.                                           $$.start = $1.start;
  438.                                           $$.end = $1.end; 
  439.                                           $$.val = new_string($1.val);
  440.                                           if ( $1.val ) {
  441.                                               FREE( $1.val );
  442.                                               $1.val = 0;
  443.                                           }
  444.                                        }
  445.   |             TOK_OPEN exp TOK_CLOSE {
  446.                                           $$.line = $1.line; 
  447.                                           $$.start = $1.start;
  448.                                           $$.end = $3.end; 
  449.                                           $$.val = $2.val;
  450.                                        }
  451.   |             TOK_OPEN error         {  ERR("expression expected after '('");
  452.                                           $$.val = 0;
  453.                                        }                                     
  454.   ;
  455.   
  456. objpart:        TOK_NAME               {
  457.                                           $$.line = $1.line; 
  458.                                           $$.start = $1.start;
  459.                                           $$.end = $1.end; 
  460.                                           $$.val = new_part($1.val);
  461.                                           if ( $1.val ) {
  462.                                               FREE( $1.val );
  463.                                               $1.val = 0;
  464.                                           }
  465.                                        }    
  466.   |             dol_exp                {  $$.line = $1.line;
  467.                                           $$.start = $1.start;
  468.                                           $$.end = $1.end; 
  469.                                           $$.val = new_exppart( $1.val );
  470.                                        }   
  471.   |             objpart TOK_OPEN arglist TOK_CLOSE {
  472.                                           $$.line = $1.line; 
  473.                                           $$.start = $1.start;
  474.                                           $$.end = $4.end; 
  475.                                           $$.val = new_fun( $1.val, $3.val );
  476.                                        } 
  477.   |             objpart TOK_OPENB exp TOK_CLOSEB {
  478.                                           $$.line = $1.line; 
  479.                                           $$.start = $1.start;
  480.                                           $$.end = $4.end; 
  481.                                           $$.val = new_tab( $1.val, $3.val );
  482.                                        } 
  483.   |             objpart TOK_OPEN error {  ERR("bad function call argument");
  484.                                           $$.val = 0;
  485.                                        }                                     
  486.   |             objpart TOK_OPENB error { ERR("expression expected after '['");
  487.                                           $$.val = 0;
  488.                                        }      
  489.   ;
  490.  
  491.  
  492. arglist:        /* nil */              {  $$.val = 0; }
  493.   |             arglist1               
  494.   ;
  495.  
  496. arglist1:       exp                    {
  497.                                           $$.line = $1.line; 
  498.                                           $$.start = $1.start;
  499.                                           $$.end = $1.end; 
  500.                                           $$.val = new_explist( 0, $1.val );
  501.                                        } 
  502.   |             arglist1 TOK_COM exp   {
  503.                                           $$.line = $1.line; 
  504.                                           $$.start = $1.start;
  505.                                           $$.end = $3.end; 
  506.                                           $$.val = new_explist($1.val, $3.val);
  507.                                        } 
  508.   ;
  509.   
  510. ctl_cmd:        cmd_if
  511.   |             cmd_function
  512.   |             cmd_switch
  513.   |             cmd_for
  514.   |             cmd_exp
  515.   |             cmd_embed
  516.   |             cmd_emit 
  517.   |             cmd_output
  518.   |             cmd_local 
  519.   |             cmd_return
  520.   |             cmd_break 
  521.   |             cmd_push  
  522.   |             cmd_pop   
  523.   |             cmd_use
  524.   |             cmd_exit
  525.   |             TOK_AT                 {  $$.line = $1.line;
  526.                                           $$.cmd = 0; }
  527.   |             TOK_AT error           {  $$.line = $1.line;
  528.                                           ERR( "bad '@' command" );
  529.                                           $$.cmd = 0;
  530.                                        } 
  531.   ;
  532.   
  533. cmd_if:         TOK_IF exp TOK_NL lines TOK_ENDIF  {
  534.                                          $$.line = $1.line;
  535.                                          $$.cmd=new_if($2.val,$5.line,$5.line); 
  536.                                        }
  537.   |             TOK_IF exp TOK_NL lines TOK_ELSE TOK_NL lines TOK_ENDIF {
  538.                                          $$.line = $1.line;
  539.                                          $$.cmd=new_if($2.val,$5.line,$8.line); 
  540.                                        }
  541.   |             TOK_IF error           { ERR( "@if command malformed" );
  542.                                          $$.cmd = 0;
  543.                                        }
  544.   ;
  545.                                        
  546. fun_body:       lines TOK_ENDFUNCTION  { $$.end = $2.line; } 
  547.   |             error                  { ERR("@function not closed");
  548.                                          $$.val = 0; } 
  549.   ;
  550.   
  551. cmd_function:   TOK_FUNCTION TOK_NAME TOK_OPEN param_list TOK_CLOSE 
  552.                 TOK_NL fun_body     {
  553.                                       int _regres;
  554.                                       $$.line = $1.line;
  555.                                       $$.cmd = new_function( $2.val, $4.val,
  556.                                               $7.end ); 
  557.                                       if ( regfun( $2.val, curfilen, 
  558.                                                   $1.line ) == 2 ) 
  559.                                           warning( "warning: function duplicated" );
  560.                                       if ( $2.val ) FREE( $2.val );
  561.                                     }  
  562.   |             TOK_FUNCTION  error  {
  563.                                       ERR("bad @function header");
  564.                                       $$.cmd = 0;
  565.                                     }
  566.   ;
  567.   
  568. param_list:     /* empty */         { $$.val = 0; }
  569.   |             param_list1          
  570.   ;
  571.   
  572. param_list1:    TOK_NAME            { $$.line = $1.line;
  573.                                       $$.val = new_parlist( 0, $1.val ); 
  574.                                       if ( $1.val ) FREE( $1.val );
  575.                                     }
  576.   |             param_list1 TOK_COM TOK_NAME {
  577.                                       $$.line = $1.line;
  578.                                       $$.val = new_parlist( $1.val, $3.val ); 
  579.                                       if ( $3.val ) FREE( $3.val );
  580.                                     } 
  581.   ;
  582.   
  583. cmd_switch:     TOK_SWITCH exp TOK_NL case_list TOK_ENDSWITCH {
  584.                                       $$.line = $1.line;
  585.                                       $$.cmd = new_switch($2.val,$4.val,
  586.                                               $1.line,$5.line);
  587.                                     }  
  588.   |             TOK_SWITCH exp TOK_NL error  { ERR( "@case expected" );
  589.                                       $$.cmd = 0;
  590.                                     }
  591.   ;
  592.   
  593. case_list:      case_item          {  $$.line = $1.line;
  594.                                       $$.val = new_caselist(0,$1.val,$1.line);
  595.                                    }   
  596.   |             case_list case_item { $$.line = $1.line;
  597.                                       $$.val = new_caselist($1.val, 
  598.                                               $2.val, $2.line );
  599.                                    }
  600.   ;
  601.   
  602. case_item:      TOK_CASE exp TOK_COLON TOK_NL lines {
  603.                                       $$.line = $2.line;
  604.                                       $$.val = $2.val;
  605.                                    }   
  606.   |             TOK_CASE error     {  ERR("after @case expected expression and ':'");
  607.                                       $$.val = 0;
  608.                                    }
  609.   ;
  610.   
  611. cmd_for:        TOK_FOR forctl TOK_NL lines TOK_ENDFOR {
  612.                                       $$.line = $1.line;
  613.                                       $$.cmd = new_for($2.val, $1.line, $5.line);
  614.                                    }   
  615.   |             TOK_FOR error      {  ERR( "bad @for command syntax" );
  616.                                       $$.cmd = 0; $$.line = $1.line;
  617.                                    }
  618.   ;
  619.   
  620. forctl:         TOK_OPEN optexp TOK_SCOL optexp TOK_SCOL optexp TOK_CLOSE {
  621.                                       $$.line = $1.line;
  622.                                       $$.val = new_forctl($2.val,$4.val,$6.val);
  623.                                    }     
  624.   |             TOK_OPEN dol_exp TOK_IN exp TOK_CLOSE {
  625.                                       $$.line = $1.line;
  626.                                       $$.start = $1.start;
  627.                                       $$.end = $5.end;
  628.                                       $$.val = new_lforctl($2.val,$4.val);  
  629.                                    }      
  630.   |             TOK_OPEN error     {  ERR( "bad @for command syntax" );
  631.                                       $$.val = 0;
  632.                                    }
  633.   ;
  634.   
  635. cmd_return:     TOK_RETURN exp     {  $$.line = $1.line;
  636.                                       $$.cmd = new_return( $2.val );
  637.                                    }   
  638.   |             TOK_RETURN error   {  ERR( "@return without argument" );
  639.                                       $$.cmd = 0;
  640.                                    }
  641.   ;
  642.   
  643. cmd_break:      TOK_BREAK          {  $$.line = $1.line;
  644.                                       $$.cmd = new_break( $1.line );
  645.                                    }   
  646.   ;
  647.   
  648. cmd_push:       TOK_PUSH           {  $$.line = $1.line;
  649.                                       $$.cmd = new_push();
  650.                                    }   
  651.   ;
  652.   
  653. cmd_pop:        TOK_POP            {  $$.line = $1.line;
  654.                                       $$.cmd = new_pop();
  655.                                    }   
  656.   ;
  657.   
  658. optexp:         /* empty */        {  $$.val = 0;  }
  659.   |             exp              
  660.   |             error              {  ERR( "expression expected" );
  661.                                       $$.val = 0; 
  662.                                    }
  663.   ;
  664.   
  665. cmd_exp:        TOK_AT exp         {  $$.line = $1.line;
  666.                                       $$.cmd = new_cmdexp( $2.val ); }
  667.   ;
  668.   
  669. cmd_embed:      TOK_EMBED exp      {  $$.line = $1.line;
  670.                                       $$.cmd = new_embed( $2.val ); }
  671.   ;
  672.   
  673. cmd_emit:       TOK_EMIT exp       {  $$.line = $1.line;
  674.                                       $$.cmd = new_emit( $2.val ); }
  675.   ;
  676.   
  677. cmd_output:     TOK_OUTPUT exp     {  $$.line = $1.line;
  678.                                       $$.cmd = new_output( $2.val ); }
  679.   ;
  680.   
  681. cmd_local:      TOK_LOCAL TOK_NAME {  $$.line = $1.line;
  682.                                       $$.cmd = new_local( $2.val ); }
  683.   ;
  684.   
  685. cmd_use:        TOK_USE TOK_NAME   {  $$.line = $1.line;
  686.                                       $$.cmd = new_use( $2.val ); }
  687.   |             TOK_USE TOK_STRING {  $$.line = $1.line;
  688.                                       $$.cmd = new_use( unquote($2.val) );
  689.                                       if ($2.val) FREE($2.val);
  690.                                    }
  691.   ;
  692.  
  693. cmd_exit:       TOK_EXIT           {  $$.line = $1.line;
  694.                                       $$.cmd = new_exit( 0 );
  695.                                    }              
  696.   |             TOK_EXIT exp       {  $$.line = $1.line;
  697.                                       $$.cmd = new_exit( $2.val );
  698.                                    }
  699.   ;
  700.  
  701.